package com.school.sports.mapper;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.school.sports.dto.ProjectDTO;
import com.school.sports.entity.Project;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 项目表Mapper接口
 * 提供项目相关的数据库操作方法，包含优化的分页查询
 */
@Mapper
public interface ProjectMapper extends BaseMapper<Project> {

    /**
     * 查询项目及创建人信息
     * @param id 项目ID
     * @return 项目实体（含创建人信息）
     */
    Project selectProjectWithCreator(Long id);

    /**
     * 分页查询项目信息（包含创建者和统计信息）
     * 使用JOIN查询避免N+1问题
     *
     * @param page 分页参数
     * @param name 项目名称（可选）
     * @param type 项目类型（可选）
     * @param status 项目状态（可选）
     * @param genderLimit 性别限制（可选）
     * @return 分页结果
     */
    IPage<ProjectDTO> selectProjectPageWithDetails(
            Page<ProjectDTO> page,
            @Param("name") String name,
            @Param("type") String type,
            @Param("status") String status,
            @Param("genderLimit") String genderLimit
    );

    /**
     * 根据项目ID查询项目详细信息（包含创建者和报名统计）
     *
     * @param projectId 项目ID
     * @return 项目详细信息
     */
    ProjectDTO selectProjectByIdWithDetails(@Param("projectId") Long projectId);

    /**
     * 根据项目名称模糊查询项目列表
     *
     * @param name 项目名称
     * @return 项目列表
     */
    List<ProjectDTO> selectProjectsByNameLike(@Param("name") String name);

    /**
     * 查询可以报名的项目列表
     *
     * @return 可报名项目列表
     */
    List<ProjectDTO> selectAvailableProjects();
}